import { LoggerLevel } from '../logger';
import RequestData, { IParams, IRequestData } from './index';
// 新增：引入 eventsource-parser（仅测试使用）
import {
    createParser,
    EventSourceMessage,
} from 'eventsource-parser';

jest.setTimeout(30000); // 延长测试超时时间，便于流式响应完成
describe('Request', () => {
    let requestData: any;

    beforeEach(() => {
        requestData = new RequestData({ loggerLevel: LoggerLevel.Debug });
    });

    // test('post signin (RequestData)', async () => {
    //     const url = 'https://nutri.gene.api.wuditech.cn/api/v1/user/profile';
        
    //     const request = new RequestData({ type: RequestData.Type.Fetch, loggerLevel: LoggerLevel.Error });
    //     const res = await request.get<any>(url);
    //     console.log('登录', res);
    // })

    test('post signin (axios)', async () => {
        const url = 'http://172.31.12.110:5053/api/v1/conversation';
        const body = [12];
        const request = new RequestData({ type: RequestData.Type.Fetch, loggerLevel: LoggerLevel.Info });
        const res = await request.delete<any>(url, body);
        console.log('登录', res);
    })

    // test('post chat stream (RequestData)', async () => {
    //     const url = 'https://nutri.gene.api.wuditech.cn/api/v1/conversation/chat/simulation';
    //     const body = { message: 'hello' };

    //     const request = new RequestData({ type: RequestData.Type.Fetch, loggerLevel: LoggerLevel.Error });
    //     request.setResponseType('stream');
    //     request.setTimeout(10000); // 可选：避免长连导致测试无法结束
    //     request.setRequestConfig({ fetchOptions: { reactNative: { streaming: true } } })
    //     // 返回数据流
    //     const stream = await request.postStream<ReadableStream<Uint8Array>>(url, body);
    //     expect(stream).toBeDefined();

    //     // 使用这个：仅 onEvent 的对象回调
    //     const parsedEvents: any[] = [];
    //     const sseParser = createParser({
    //         onEvent: (event: EventSourceMessage) => {
    //             let data: any = event.data;
    //             try { data = JSON.parse(event.data); } catch { /* 非 JSON 则保留原始字符串 */ }
    //             console.log('SSE onEvent:', event.event ?? 'message', data);
    //             parsedEvents.push({ event: event.event ?? 'message', data });
    //         }
    //     });

    //     // 消费数据流直到结束，并将块喂给解析器
    //     const reader = stream!.getReader();
    //     const decoder = new TextDecoder('utf-8');
    //     let fullText = '';

    //     try {
    //         for (; ;) {
    //             const { done, value } = await reader.read();
    //             if (done) break;
    //             if (!value) continue;
    //             const chunkText = decoder.decode(value, { stream: true });
    //             fullText += chunkText;

    //             // 喂给 eventsource-parser
    //             sseParser.feed(chunkText);
    //         }
    //     } catch (err: any) {
    //         if (err?.name !== 'AbortError') throw err;
    //     }

    //     // 原始聚合文本断言 + 解析事件断言
    //     expect(typeof fullText).toBe('string');
    //     expect(Array.isArray(parsedEvents)).toBe(true);
    //     console.log('Parsed events count:', parsedEvents.length);
    // });

    // test('post chat stream (RequestData) with timeout', async () => {
    //    const url = 'https://nutri.gene.api.wuditech.cn/api/v1/conversation/chat/simulation';
    // const controller = new AbortController();
    // const decoder = new TextDecoder('utf-8');
    // const abortTimer = setTimeout(() => controller.abort(), 10000);
    // console.log('[fetch] start download:', url);
    // fetch(url, {
    //   method: 'POST',
    //   headers: {
    //     'Content-Type': 'application/json',
    //     Accept: 'text/event-stream, application/json',
    //   },
    //   body: JSON.stringify({ message: '你好' }),
    //   reactNative: { textStreaming: true },
    //   signal: controller.signal,
    // })
    //   .then(async (response) => {
    //     if (!response) throw new Error('Response is null');
    //     const ct = response.headers.get('content-type') || '';
    //     const stream = response.body;
    //     if (!stream) throw new Error('Response body is null');

    //     const reader = stream.getReader();

    //     // 按需加载，避免顶层 import 修改
    //     const { createParser } = require('eventsource-parser');
    //     // ✅ 3.x 正确用法：传入“回调对象”
    //     const parser = createParser({
    //       onEvent: (evt: { id?: string; event?: string; data: string }) => {
    //         console.log('[sse] event:', evt.event ?? 'message');
    //         console.log('[sse] data:', evt.data);
    //         // 如服务端 data 是 JSON，可尝试解析
    //         try {
    //           const json = JSON.parse(evt.data);
    //           console.log('[sse] parsed json:', json);
    //         } catch {
    //           // 非 JSON 文本时忽略解析错误
    //         }
    //       },
    //       onRetry: (ms: number) => {
    //         console.log('[sse] reconnect interval(ms):', ms);
    //       },
    //       onComment: (c: string) => {
    //         // 可选：SSE 注释行
    //         console.debug('[sse] comment:', c);
    //       },
    //       onError: (err: any) => {
    //         console.warn('[sse] parse error:', err?.message ?? err);
    //       },
    //     });

    //     try {
    //       for (; ;) {
    //         const { done, value } = await reader.read();
    //         if (done) break;
    //         if (value) {
    //           const chunkText = decoder.decode(value, { stream: true });
    //           parser.feed(chunkText);
    //         }
    //       }
    //       // 结束解码，处理尾部残留
    //       const tail = decoder.decode();
    //       if (tail) parser.feed(tail);

    //       console.log('[sse] stream completed. content-type:', ct);
    //       if (!ct.includes('text/event-stream')) {
    //         console.log('[sse] non-SSE response, consider fallback handling');
    //       }
    //     } catch (err: any) {
    //       if (err?.name !== 'AbortError') throw err;
    //     } finally {
    //       clearTimeout(abortTimer);
    //     }
    //   })
    //   .catch((err) => {
    //     console.log('Request error', err);
    //   });
    // })
})
